package com.cy.pj.module.controller;

import com.cy.pj.module.pojo.RequestParameter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;

/*
    通过此Controller处理请求中参数
    1)将参数直接赋值给直接赋值给方法参数中的直接量变量(8中封装类+String+Date)
    2)将请求参数直接赋值给pojo对象(pojo对象需要提供与请求参数对应的set方法)
    3)将请求参数直接赋值给map对象(key/value)

    客户端常用传参方是?
    1)普通方式:url?paramName1=paramValue1
    2)rest方式:path/{paramName}
 */
@RestController
public class ParamObjectController {
    //以直接量的方式接收请求中的参数(方法中的参数名需要与请求参数名相同)
    @RequestMapping("/doHandleRequestParam")
    public String doHandleRequestParam(String name){
        return "request params is"+name;
    }
    @RequestMapping("/doHandleRequestParam02")
    public String doHandleRequestParam02(String name, @DateTimeFormat(pattern = "yyyy-MM-dd") @RequestParam(required = true) Date startDate){
        return "request params name="+name+"/startDate="+startDate;
    }

    /**
     * rest风格url定义
     * rest风格:一种软件架构编码风格,这种风格中定义了url的一种格式,其语法:
     * /a/b/{c}/d/{e},其中{}内的 内容为变量
     * @param id
     * @return
     */
    @RequestMapping("/doHandleRequestParam03/{id}/{code}/{date}")
    public String doHandleRequestParam03(@PathVariable Integer id,@PathVariable Integer code,@DateTimeFormat(pattern = "yyyy-MM-dd") @PathVariable Date date){
        return "request params id="+id+"/code="+code+"/date="+date;
    }

    //---------------------------------
    //基于pojo对象接收请求中的数据
    @RequestMapping("/doHandleRequestParam04")
    public String doHandleRequestParam04(RequestParameter pojo){
        return  "request params="+pojo;
    }

    @RequestMapping("/doHandleRequestParam05/{name}/{startDate}")
    public String doHandleRequestParam05(RequestParameter pojo){
        return  "request params="+pojo;
    }

    //================================

    /**
     * 基于map对象接收请求中的数据,不推荐(map一般无法对请求参数进行限制)
     * @param map
     * @return
     * 假如用map接收请求参数,需要在方法参数前使用@RequestParam注解进行描述
     */
    @RequestMapping("/doHandleRequestParam06")
    public String doHandleRequestParam06(@RequestParam Map<String,Object> map){
        return  "request params="+map.toString();
    }

    /**
     * rest风格url参数
     * @param map
     * @return
     * 说明:当使用map接收rest风格中的数据时,需要使用@PathVariable注解对map参数进行描述,
     * 不能使用@RequestParam注解,因为此注解描述的参数只能接收普通url中?符号后面定义的参数值
     */
    @RequestMapping("/doHandleRequestParam07/{name}/{startDate}")
    public String doHandleRequestParam07(Map<String,Object> map){
        return  "request params="+map.toString();
    }
}
